package com.util;

import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import com.vo.Calles;

public class LeerXML {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		try {
			File file = new File("files\\mapa.xml");
			DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
			DocumentBuilder db = dbf.newDocumentBuilder();
			Document doc = db.parse(file);
			doc.getDocumentElement().normalize();
			System.out.println("Raiz " + doc.getDocumentElement().getNodeName());
			
			// Obtengo todas las esquinas
			NodeList esquinas = doc.getElementsByTagName("Corners");
			System.out.println("-- Esquinas");
			System.out.println("");

			for(int i=0; i<esquinas.getLength(); i++) {

			    Node fstNode = esquinas.item(i);
			    
			    if(fstNode.getNodeType() == Node.ELEMENT_NODE) {
			  
			    	Element fstElmnt = (Element) fstNode;
			    	NodeList fstNmElmntLst = fstElmnt.getElementsByTagName("Corner");
			    	
			    	for(int j=0; j<fstNmElmntLst.getLength(); j++) {
				    	
			    		Element fstNmElmnt = (Element) fstNmElmntLst.item(j);
				    	
				    	// Obtengo los atributos de la esquina
				    	String id = fstNmElmnt.getAttribute("Id");
				    	String x = fstNmElmnt.getAttribute("XCoordinate");
				    	String y = fstNmElmnt.getAttribute("YCoordinate");
				    	
				    	System.out.println("INSERT INTO esquina VALUES ("+id+", "+x+", "+y+");");
			    	}
			    }
			}
			
			// Obtengo todas las cuadras
			NodeList cuadras = doc.getElementsByTagName("Blocks");
			System.out.println("-- Cuadras");
			System.out.println("");
			
			for(int i=0; i<cuadras.getLength(); i++) {

			    Node fstNode = cuadras.item(i);
			    
			    if(fstNode.getNodeType() == Node.ELEMENT_NODE) {
			  
			    	Element fstElmnt = (Element) fstNode;
			    	NodeList fstNmElmntLst = fstElmnt.getElementsByTagName("Block");
			    	
			    	// Creo el array para guardar las calles
			    	ArrayList<Calles> calles = new ArrayList<Calles>();
					int ultimoId = 0;
			    	
			    	for(int j=0; j<fstNmElmntLst.getLength(); j++) {
				    	
			    		Element fstNmElmnt = (Element) fstNmElmntLst.item(j);
				    	
			    		// Obtengo la calle
			    		String nomCalle = fstNmElmnt.getAttribute("street");
			    		if(!nomCalle.isEmpty()){
				    		Calles c = new Calles(ultimoId+1, nomCalle);
				    		int idCalle = obtenerIdCalle(calles, nomCalle);
				    		
				    		if(idCalle == -1){
				    			
				    			// Inserto la calle en el array
				    			calles.add(c);
				    			
				    			// Generar SQL para insertar la calle
				    			ultimoId++;
				    			System.out.println("");
				    			System.out.println("-- Calle " + nomCalle);
				    			System.out.println("INSERT INTO calles VALUES ("+ultimoId+", '"+nomCalle+"');");
				    			System.out.println("");
				    			
				    			idCalle = ultimoId;
				    		}
				    		
					    	// Obtengo los atributos de la cuadra
				    		String id = fstNmElmnt.getAttribute("Id");
				    		String sentido = fstNmElmnt.getAttribute("Direction");
				    		if(sentido.equals("From")){
				    			sentido = "0";
				    		}else if(sentido.equals("Both")){
				    			sentido = "1";
				    		}
					    	String idEsquina1 = fstNmElmnt.getAttribute("From");
					    	String idEsquina2 = fstNmElmnt.getAttribute("To");
					    	
					    	System.out.println("INSERT INTO cuadras VALUES ("+idCalle+", "+sentido+", "+idEsquina1+", "+idEsquina2+");");
			    		}
			    	}
			    }
			}
		}catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static int obtenerIdCalle(ArrayList<Calles> calles, String nomCalle) {
		
		Iterator<Calles> it = calles.iterator();
		while(it.hasNext()) {
			
			Calles c = it.next();
			if(c.getNombre().equals(nomCalle)){
				return c.getIdCalle();
			}
		}
		
		return -1;
	}
}